bitkeeper revision 1.358.1.1 (3f16a58eCfq6ZxRU1cDvl3KdW6uV4g)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 17 Jul 2003 13:33:02 +0000 (13:33 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 17 Jul 2003 13:33:02 +0000 (13:33 +0000)
network.c, xi_stop.c, xi_start.c, xi_destroy.c, xi_build.c:
  Bug fixes and clean ups.

tools/internal/xi_build.c
tools/internal/xi_destroy.c
tools/internal/xi_start.c
tools/internal/xi_stop.c
xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c

index 8c1cdb91da2c475de9ed6223cbdeca2a6d1f1409..b6c30d2a647674e2e11299e9ebd8ff65f17d3064 100644 (file)
@@ -361,7 +361,13 @@ int main(int argc, char **argv)
         return 1;
     }
 
-    domain_id = atol(argv[1]);
+    domain_id = atoi(argv[1]);
+    if ( domain_id == 0 )
+    {
+        ERROR("Did you really mean domain 0?");
+        return 1;
+    }
+
     if ( (tot_pages = get_tot_pages(domain_id)) < 0 )
     {
         PERROR("Could not find total pages for domain");
index d6b7a09763f8c3109342c94caa60ab9aa0f185bd..b3a975e73fd80badadb5ed455855f96e357f20de 100644 (file)
@@ -21,7 +21,7 @@ static int kill_domain(int dom_id, int force)
 
 int main(int argc, char **argv)
 {
-    int ret;
+    int ret, dom;
     
     if ( argv[0] != NULL ) 
         argv0 = argv[0];
@@ -37,7 +37,14 @@ int main(int argc, char **argv)
     if ( (argc == 3) && strcmp("-f", argv[1]) )
         goto usage;
     
-    ret = kill_domain(atoi(argv[argc-1]), argc == 3);
+    dom = atoi(argv[argc-1]);
+    if ( dom == 0 )
+    {
+        ERROR("Did you really mean domain 0?");
+        return 1;
+    }
+
+    ret = kill_domain(dom, argc == 3);
     
     return (ret != 0) ? 1 : 0;
 }
index b21cc84f9f5803e320444373c2e4051b17872502..e04fc8b50290f30eb6e613fb0a19a901dbe46421 100644 (file)
@@ -20,7 +20,7 @@ static int start_domain(int id)
 
 int main(int argc, char **argv)
 {
-    int rc;
+    int rc, dom;
 
     if ( argv[0] != NULL ) 
         argv0 = argv[0];
@@ -31,7 +31,14 @@ int main(int argc, char **argv)
         return 1;
     }
 
-    rc = start_domain(atol(argv[1]));
+    dom = atoi(argv[1]);
+    if ( dom == 0 )
+    {
+        ERROR("Did you really mean domain 0?");
+        return 1;
+    }
+
+    rc = start_domain(dom);;
 
     return (rc != 0) ? 1 : 0;
 }
index 5cd732df3a3f143bcefe3e78ab8215610c31507c..1c10fe4eb8b86deccdbc2818e6bd98c1150975fc 100644 (file)
@@ -19,7 +19,7 @@ static int stop_domain(int id)
 
 int main(int argc, char **argv)
 {
-    int rc;
+    int rc, dom;
 
     if ( argv[0] != NULL ) 
         argv0 = argv[0];
@@ -30,7 +30,14 @@ int main(int argc, char **argv)
         return 1;
     }
 
-    rc = stop_domain(atol(argv[1]));
+    dom = atoi(argv[1]);
+    if ( dom == 0 )
+    {
+        ERROR("Did you really mean domain 0?");
+        return 1;
+    }
+
+    rc = stop_domain(dom);
 
     return (rc != 0) ? 1 : 0;
 }
index a125695e54245cca248140a431d7a7921d287057..c3479b64c07588da0a67aa8dbf96aec00477e38f 100644 (file)
@@ -47,6 +47,12 @@ static void cleanup_module(void);
 
 static struct list_head dev_list;
 
+/*
+ * Needed because network_close() is not properly implemented yet. So
+ * an open after a close needs to do much less than the initial open.
+ */
+static int opened_once_already = 0;
+
 struct net_private
 {
     struct list_head list;
@@ -100,6 +106,13 @@ static int network_open(struct net_device *dev)
     struct net_private *np = dev->priv;
     int i, error = 0;
 
+    if ( opened_once_already )
+    {
+        memset(&np->stats, 0, sizeof(np->stats));
+        netif_start_queue(dev);
+        return 0;
+    }
+
     np->rx_resp_cons = np->tx_resp_cons = np->tx_full = 0;
     memset(&np->stats, 0, sizeof(np->stats));
     spin_lock_init(&np->tx_lock);
@@ -150,6 +163,8 @@ static int network_open(struct net_device *dev)
 
     MOD_INC_USE_COUNT;
 
+    opened_once_already = 1;
+
     return 0;
 
  fail:
@@ -228,15 +243,16 @@ static void network_alloc_rx_buffers(struct net_device *dev)
             virt_to_machine(get_ppte(skb->head));
     }
 
-    np->net_idx->rx_req_prod = i;
-
-    np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
-
     /*
      * We may have allocated buffers which have entries outstanding in
      * the page update queue -- make sure we flush those first!
      */
     flush_page_update_queue();
+
+    np->net_idx->rx_req_prod = i;
+
+    np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
+
     HYPERVISOR_net_update();
 }
 
@@ -385,9 +401,6 @@ int network_close(struct net_device *dev)
 {
     netif_stop_queue(dev);
 
-    free_irq(NET_RX_IRQ, dev);
-    free_irq(NET_TX_IRQ, dev);
-
     /*
      * XXXX This cannot be done safely until be have a proper interface
      * for setting up and tearing down virtual interfaces on the fly.
@@ -395,12 +408,15 @@ int network_close(struct net_device *dev)
      * no sensible way of retrieving them.
      */
 #if 0
+    free_irq(NET_RX_IRQ, dev);
+    free_irq(NET_TX_IRQ, dev);
+
     network_free_rx_buffers(dev);
     kfree(np->net_ring->rx_ring);
     kfree(np->net_ring->tx_ring);
-#endif
 
     MOD_DEC_USE_COUNT;
+#endif
 
     return 0;
 }